home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / vbcc.lha / vbcc / pasm / ppcasm.h < prev    next >
C/C++ Source or Header  |  1998-02-17  |  22KB  |  618 lines

  1. /* $VER: pasm ppcasm.h V0.8 (14.02.98)
  2.  *
  3.  * This file is part of pasm, a portable PowerPC assembler.
  4.  * Copyright (c) 1997-98  Frank Wille
  5.  *
  6.  * pasm is freeware and part of the portable and retargetable ANSI C
  7.  * compiler vbcc, copyright (c) 1995-98 by Volker Barthelmann.
  8.  * pasm may be freely redistributed as long as no modifications are
  9.  * made and nothing is charged for it. Non-commercial usage is allowed
  10.  * without any restrictions.
  11.  * EVERY PRODUCT OR PROGRAM DERIVED DIRECTLY FROM MY SOURCE MAY NOT BE
  12.  * SOLD COMMERCIALLY WITHOUT PERMISSION FROM THE AUTHOR.
  13.  *
  14.  *
  15.  * v0.8 (14.02.98) phx
  16.  *      Alignment list for each section. This fixes the problems
  17.  *      with optimizations.
  18.  * v0.7 (02.01.98) phx
  19.  *      Define "NetBSDAmiga68k" changed to "NetBSD68k".
  20.  *      Changed ParsedLine (next) and GlobalVars (anotherpass) to
  21.  *      allow more than two assembler passes - as required for
  22.  *      optimizations.
  23.  *      search_instr() is global.
  24.  *      Output format 3 is ADOS (like EHF, but doesn't use HUNK_PPC_CODE).
  25.  * v0.6 (30.10.97) phx
  26.  *      More options. GlobalVars: optinstrmode and supermode.
  27.  * v0.5 (12.10.97) phx
  28.  *      Add userdeflist and usrdefs to GlobalVars for symbol definitions
  29.  *      via the command line.
  30.  *      .set allows symbols to be reused.
  31.  *      Last line of a source text was ignored, if newline is missing.
  32.  * v0.4 (05.07.97) phx
  33.  *      Program returns EXIT_FAILURE if an error occurs.
  34.  *      Base address for absolute code may be set with -B option.
  35.  *      EHF support.
  36.  *      Added R_PPC_TOC16 relocation type.
  37.  *      Option -x automatically declares unknown symbols as
  38.  *      externally defined. New GlobalVars entry: autoextern.
  39.  *      Runs on Linux/DEC-Alpha with 64-bit integers.
  40.  *      Changed program name from "PPCasm" to "pasm". Reason: There
  41.  *      is already a PPCasm for Apple Macintosh.
  42.  * v0.3 (20.04.97) phx
  43.  *      Using correct names for PowerPC relocations.
  44.  *      Added little-endian conversion macros.
  45.  * v0.2 (25.03.97) phx
  46.  *      Writes ELF object for 32-bit PowerPC big-endian. Either absolute
  47.  *      or ELF output format may be selected. ELF is default for all
  48.  *      currently supported platforms. PPCasm supports nine different
  49.  *      relocation types (there are much more...).
  50.  *      Compiles and works also under NetBSD/amiga (68k).
  51.  *      Changed function declaration to 'new style' in all sources
  52.  *      (to avoid problems with '...' for example).
  53.  *      Included NetBSD/amiga as supported architecture.
  54.  * v0.1 (11.03.97) phx
  55.  *      First test version with all PowerPC instructions and most
  56.  *      important directives. Only raw, absolute output.
  57.  * v0.0 (14.02.97) phx
  58.  *      File created. Project started.
  59.  */
  60.  
  61. #include <stdlib.h>
  62. #include <stdio.h>
  63. #include <string.h>
  64. #include <stdarg.h>
  65. #include <ctype.h>
  66.  
  67. /* program's name */
  68. #define PNAME "pasm"
  69.  
  70. /* version/revision */
  71. #define VERSION 0
  72. #define REVISION 80
  73.  
  74. /* architecture specific defines */
  75. #if defined (AmigaOS68k)
  76. #define MACHINE "Amiga OS/M68k"
  77. #define BIGENDIAN
  78. #define STDTYPES
  79. #elif defined (AmigaOSPPC)
  80. #define MACHINE "Amiga OS/PowerPC"
  81. #define BIGENDIAN
  82. #define STDTYPES
  83. #elif defined (NetBSD68k)
  84. #define MACHINE "NetBSD/M68k"
  85. #define BIGENDIAN
  86. #define STDTYPES
  87. #elif defined (SolarisSparc)
  88. #define MACHINE "Solaris/Sparc"
  89. #define BIGENDIAN
  90. #define STDTYPES
  91. #elif defined (SunOSSparc)
  92. #define MACHINE "SunOS/Sparc"
  93. #define BIGENDIAN
  94. #define STDTYPES
  95. #elif defined (SCOi386)
  96. #define MACHINE "SCO/i386"
  97. #define LITTLEENDIAN
  98. #define STDTYPES
  99. #elif defined (Linuxi386)
  100. #define MACHINE "Linux/i386"
  101. #define LITTLEENDIAN
  102. #define STDTYPES
  103. #elif defined (LinuxAlpha)
  104. #define MACHINE "Linux/Alpha"
  105. #define LITTLEENDIAN
  106. #define TYPES64BIT
  107. #else
  108. #error Unsupported architecture! Please adapt the source text.
  109. #endif
  110.  
  111. #ifdef STDTYPES
  112. typedef signed char int8;
  113. typedef unsigned char uint8;
  114. typedef signed short int int16;
  115. typedef unsigned short int uint16;
  116. typedef signed long int int32;
  117. typedef unsigned long int uint32;
  118. typedef signed char bool;
  119. #elif defined (TYPES64BIT)
  120. typedef signed char int8;
  121. typedef unsigned char uint8;
  122. typedef signed short int16;
  123. typedef unsigned short uint16;
  124. typedef signed int int32;
  125. typedef unsigned int uint32;
  126. typedef int bool;
  127. #else
  128. #error Unsupported architecture! Please adapt the source text.
  129. #endif
  130.  
  131. /* endian conversion */
  132. #if defined (BIGENDIAN)
  133. #define ECH(x) x
  134. #define ECW(x) x
  135. #define ECVH(x) x
  136. #define ECVW(x) x
  137. #elif defined (LITTLEENDIAN)
  138. #define ECH(x) (((x)&0xff)<<8|((x)&0xff00)>>8)
  139. #define ECW(x) (((x)&0xff)<<24|((x)&0xff00)<<8|((x)&0xff0000)>>8|((x)&0xff000000)>>24)
  140. #define ECVH(x) l2bh(x)
  141. #define ECVW(x) l2bw(x)
  142. #else
  143. #error You have to define either BIGENDIAN or LITTLEENDIAN.
  144. #endif
  145.  
  146.  
  147. /* program constants */
  148.  
  149. #ifndef TRUE
  150. #define TRUE 1
  151. #endif
  152. #ifndef FALSE
  153. #define FALSE 0
  154. #endif
  155. #ifndef NULL
  156. #define NULL 0
  157. #endif
  158.  
  159. #define FNAMEBUFSIZE 1024       /* buffer size for file names */
  160. #define EXPSTACKSIZE 32         /* maximum arguments in an expression */
  161.  
  162.  
  163. /* structures */
  164.  
  165. struct node {
  166.   struct node *next;
  167.   struct node *pred;
  168. };
  169.  
  170. struct list {
  171.   struct node *first;
  172.   struct node *dummy;
  173.   struct node *last;
  174. };
  175.  
  176. struct CPUInstr {
  177.   struct CPUInstr *hash_chain;  /* next instruction in hash chain */
  178.   char *name;                   /* instruction's name */
  179.   uint16 flags;                 /* format flags */
  180.   uint8 type;                   /* instruction format, see defines */
  181.   uint8 opcd;                   /* opcode (bit 0-5) */
  182.   uint8 fieldD;                 /* preset D field (bit 6-10) */
  183.   uint8 fieldA;                 /* preset D field (bit 11-15) */
  184.   uint16 xo;                    /* extended opcode (bit 21-31) */
  185. };
  186. /* CPU instruction formats */
  187. #define T_I 0                   /* Bx */
  188. #define T_B 1                   /* BCx */
  189. #define T_DD 2                  /* LWZ */
  190. #define T_DI 3                  /* ADDI */
  191. #define T_DS 4                  /* LD */
  192. #define T_X 5                   /* AND */
  193. #define T_IMM 6                 /* MTFSFI */
  194. #define T_XLB 7                 /* BCLRx */
  195. #define T_XSPR 8                /* MFSPR */
  196. #define T_XCRM 9                /* MTCRF */
  197. #define T_XFL 10                /* MTFSF */
  198. #define T_XS 11                 /* SRADIx */
  199. #define T_A 12                  /* FMADDx */
  200. #define T_M 13                  /* RLWIMIx */
  201. #define T_MD 14                 /* RLDICx */
  202. #define T_CMP 15                /* CMP */
  203. /* CPU instruction flags */
  204. #define F_SUPP_D 0x01           /* D = 0 */
  205. #define F_SUPP_A 0x02           /* A = 0 */
  206. #define F_SUPP_B 0x04           /* B = 0 */
  207. #define F_SUPP_C 0x08           /* C = 0 */
  208. #define F_CRF_D 0x10            /* D = CR field */
  209. #define F_CRF_S 0x20            /* S = CR field */
  210. #define F_SWAP 0x40             /* S instr.: D = S, A and S are swapped */
  211. #define F_SIGNED 0x80           /* 16 bit signed immediate */
  212. #define F_64BIT 0x100           /* 64 bit instruction */
  213. #define F_SUPER 0x200           /* supervisor-only instruction */
  214. #define F_OPTIONAL 0x400        /* optional instruction */
  215. #define F_EXTENDED 0x8000       /* extended mnemonic */
  216.  
  217. struct Directive {
  218.   struct Directive *hash_chain; /* next directive in hash chain */
  219.   char *name;                   /* directive's name */
  220.   void (*dfunct)();
  221. };
  222.  
  223. struct Macro {
  224.   struct Macro *hash_chain;     /* next macro in hash chain */
  225.   char *name;                   /* macro's name */
  226.   char *text;                   /* ptr to first macro line */
  227.   unsigned long nlines;         /* number of lines in this macro */
  228. };
  229.  
  230. struct AlignPoint {             /* defines an alignment point (.align) */
  231.   struct AlignPoint *next;
  232.   unsigned long offset;         /* section offset for alignent */
  233.   long val;                     /* alignment value */
  234.   long gap;                     /* current alignment gap */
  235. };
  236.  
  237. struct Section {
  238.   struct node n;
  239.   char *name;                   /* section's name */
  240.   uint8 type;                   /* type: code, data, bss, offsets, ... */
  241.   uint8 flags;
  242.   uint8 protection;             /* readable, writable, executable, ... */
  243.   uint8 alignment;              /* number of bits, which have to be zero */
  244.   unsigned long pc;             /* current program counter (sect. offset) */
  245.   unsigned lo